﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using l1cs.server.model.Instance;
using l1cs.server.utils;
using l1cs.server.serverpackets;
using l1cs.server.model;

namespace l1cs.server.clientpackets
{
    public class C_JoinClan : ClientBasePacket
    {
        private const String _C_JOIN_CLAN = "[C] C_JoinClan";
        private static Logger _log = Logger.getLogger( typeof( C_JoinClan ).FullName );

        public C_JoinClan( byte[] abyte0, ClientThread clientthread )
            : base( abyte0 )
        {

            L1PcInstance pc = clientthread.getActiveChar();
            if ( pc.isGhost() )
            {
                return;
            }

            L1PcInstance target = FaceToFace.faceToFace( pc );
            if ( target != null )
            {
                JoinClan( pc, target );
            }
        }

        private void JoinClan( L1PcInstance player, L1PcInstance target )
        {
            if ( !target.isCrown() )
            { // 相手がプリンスまたはプリンセス以外
                player.sendPackets( new S_ServerMessage( 92, target.getName() ) ); // \f1%0はプリンスやプリンセスではありません。
                return;
            }

            int clan_id = target.getClanid();
            String clan_name = target.getClanname();
            if ( clan_id == 0 )
            { // 相手のクランがない
                player.sendPackets( new S_ServerMessage( 90, target.getName() ) ); // \f1%0は血盟を創設していない状態です。
                return;
            }

            L1Clan clan = L1World.getInstance().getClan( clan_name );
            if ( clan == null )
            {
                return;
            }

            if ( target.getId() != clan.getLeaderId() )
            { // 相手が血盟主以外
                player.sendPackets( new S_ServerMessage( 92, target.getName() ) ); // \f1%0はプリンスやプリンセスではありません。
                return;
            }

            if ( player.getClanid() != 0 )
            { // 既にクランに加入済み
                if ( player.isCrown() )
                { // 自分が君主
                    String player_clan_name = player.getClanname();
                    L1Clan player_clan = L1World.getInstance().getClan(
                            player_clan_name );
                    if ( player_clan == null )
                    {
                        return;
                    }

                    if ( player.getId() != player_clan.getLeaderId() )
                    { // 自分が血盟主以外
                        player.sendPackets( new S_ServerMessage( 89 ) ); // \f1あなたはすでに血盟に加入しています。
                        return;
                    }

                    if ( player_clan.getCastleId() != 0 || // 自分が城主・アジト保有
                            player_clan.getHouseId() != 0 )
                    {
                        player.sendPackets( new S_ServerMessage( 665 ) ); // \f1城やアジトを所有した状態で血盟を解散することはできません。
                        return;
                    }
                }
                else
                {
                    player.sendPackets( new S_ServerMessage( 89 ) ); // \f1あなたはすでに血盟に加入しています。
                    return;
                }
            }

            target.setTempID( player.getId() ); // 相手のオブジェクトIDを保存しておく
            target.sendPackets( new S_Message_YN( 97, player.getName() ) ); // %0が血盟に加入したがっています。承諾しますか？（Y/N）
        }

        override
        public String getType()
        {
            return _C_JOIN_CLAN;
        }
    }
}